using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using RRHH.Competencias.Entities;
using RRHH.Competencias.DataAccessLayer;
using RRHH.Competencias.DataAccessLayer.Generic;


namespace RRHH.Competencias.Controladores
{
    /// <summary>
    /// Agrupa las operaciones relacionadas con los Colaboradores
    /// </summary>
    public class GestorColaborador
    {
        private IDALColaborador persistencia;
        
        public GestorColaborador()
        {
            this.persistencia = DALProvider.GetDALColaborador();
            
        }

        /// <summary>
        /// Crea un colaborador
        /// </summary>
        /// <param name="colaborador">Colaborador a crear. Se devuelve el ID del colaborador creado</param>
        public void Registrar(Colaborador colaborador)
        {
            //El SP valida que el legajo sea unico para cada Colaborador
            if (colaborador == null) throw new Exception("Debe indicar el colaborador");

            //TODO: Reglas de negocio

            persistencia.Guardar(colaborador);
        }

        /// <summary>
        /// Modifica la informacion disponible de un colaborador
        /// </summary>
        /// <param name="colaborador">Colaborador a eliminar</param>
        public void Modificar(Colaborador colaborador)
        {
            //El SP valida que el legajo sea unico para cada Colaborador
            if (colaborador == null) throw new Exception("Debe indicar el colaborador");
            if (colaborador.IdColaborador <= 0) throw new Exception("Debe indicar el ID del colaborador");

            //TODO: Reglas de negocio

            persistencia.Actualizar(colaborador);
        }

        /// <summary>
        /// Elimina un colaborador
        /// </summary>
        /// <param name="colaborador">Colaborador a eliminar. Indicar el ID</param>
        public void Eliminar(Colaborador colaborador)
        {
            throw new Exception("Metodo no implementado");
        }

        /// <summary>
        /// Activa el colaborador de la base y la persona a la cual hace referencia
        /// </summary>
        /// <param name="item"></param>
        public void Activar(Colaborador colaborador)
        {
            if (colaborador == null) throw new Exception("Debe indicar el colaborador");
            if (colaborador.IdColaborador <= 0) throw new Exception("Debe indicar el ID del colaborador");

            //TODO: Reglas de negocio

            persistencia.Activar(colaborador);
        }

        /// <summary>
        /// Borra logicamente el colaborador de la base y la persona a la cual hace referencia
        /// </summary>
        /// <param name="item"></param>
        public void Desactivar(Colaborador colaborador)
        {
            if (colaborador == null) throw new Exception("Debe indicar el colaborador");
            if (colaborador.IdColaborador <= 0) throw new Exception("Debe indicar el ID del colaborador");

            //TODO: Reglas de negocio

            persistencia.Desactivar(colaborador);
        }


        /// <summary>
        /// Obtiene los datos de un colaborador
        /// </summary>
        /// <param name="colaborador">Colaborador a completar. Indicar el ID</param>
        public void Completar(Colaborador colaborador)
        {
            if (colaborador == null) throw new Exception("Debe indicar el colaborador");
            if (colaborador.IdColaborador <= 0) throw new Exception("Debe indicar el ID del colaborador");

            try
            {
                persistencia.Completar(colaborador);                
            }
            catch (Exception ex)
            {
                throw ex;
            }

            ObtenerPuestosColaborador(colaborador);
        }

        /// <summary>
        /// Obtiene los datos de un colaborador. No obtiene informacion sobre los objetos referencia al mismo
        /// </summary>
        /// <param name="colaborador">Colaborador a completar. Indicar el ID</param>
        public void CompletarBasico(Colaborador colaborador)
        {
            if (colaborador == null) throw new Exception("Debe indicar el colaborador");
            if (colaborador.IdColaborador <= 0) throw new Exception("Debe indicar el ID del colaborador");

            persistencia.Completar(colaborador);
        }

        /// <summary>
        /// Recupera un listado de todos los colaboradores registrados
        /// </summary>
        /// <returns>Listado con todos los colaboradores</returns>
        public List<Colaborador> ObtenerListadoCompleto()
        {
            return persistencia.BuscarTodos();
        }

        public List<Colaborador> Buscar(long id, string nombre)
        {
            throw new Exception("Metodo no implementado");
        }

        public List<Colaborador> Buscar(long? colaborador_id, string legajo, string nombre,
                                        string apellido, string domicilio, string mail,
                                        string telefono, string telefonoMovil, //long? ciclo_id,
                                        bool activo)
        {
            //return persistencia.Buscar(colaborador_id, legajo, nombre, apellido, domicilio, mail,
            //                           telefono, telefonoMovil, activo); //ciclo_id, activo);
            
            List<Colaborador> colaboradores = persistencia.Buscar(colaborador_id, legajo, nombre, apellido, domicilio, mail,
                                                                  telefono, telefonoMovil, activo);

            GestorSector gestorSector = new GestorSector();
            
            foreach (Colaborador colaborador in colaboradores)
            {
                gestorSector.Completar(colaborador.Sector);
            }

            return colaboradores;
        }

        public void ObtenerListadoPorProceso(Proceso proceso)
        {
            persistencia.Completar(proceso);
        }

        /// <summary>
        /// Obtiene la informacion de los Puestos de un Colaborador
        /// </summary>
        /// <param name="IdColaborador"></param>
        public void ObtenerPuestosColaborador(Colaborador colaborador)
        {
            persistencia.ObtenerPuestosColaborador(colaborador);

            GestorPuesto gestorPuesto = new GestorPuesto();

            foreach (Puesto puesto in colaborador.Puestos)
            {
                gestorPuesto.Completar( puesto );
            }
        }

        /// <summary>
        /// Obtiene la informacion de las capacidades de un colaborador
        /// </summary>
        /// <param name="IdColaborador"></param>
        /// <returns>Listado con los datos de las capacidades</returns>
        public void ObtenerCapacidadesColaborador(Colaborador colaborador)
        {
            persistencia.ObtenerCapacidadesColaborador(colaborador);

            GestorCapacidad gestorCapacidad = new GestorCapacidad();

            foreach (Capacidad capacidad in colaborador.CapacidadesActuales)
            {
                gestorCapacidad.Completar(capacidad);
            }

            GestorEnumerador<NivelCapacidad> gestorNivel = new GestorEnumerador<NivelCapacidad>();
            List<NivelCapacidad> lstNivelCapacidad = gestorNivel.Enumeracion;

            foreach (NivelCapacidad nivel in lstNivelCapacidad)
            {
                foreach (Capacidad capacidad in colaborador.CapacidadesActuales)
                {
                    if (nivel.Id == capacidad.Nivel.Id)
                    {
                        capacidad.Nivel.Nombre = nivel.Nombre;
                    }
                }
            }
        }

        /// <summary>
        /// Obtiene la informacion Activa de los Puestos, Tareas y Capacidades de un Colaborador
        /// </summary>
        /// <param name="IdColaborador"></param>
        public DataTable ObtenerPuestosTareasCapacidadesColaborador(Colaborador colaborador)
        {
            return persistencia.ObtenerPuestosTareasCapacidadesColaborador(colaborador);
        }


        /// <summary>
        /// Obtiene toda la informacion (valores por defecto) de los Puestos, Tareas y Capacidades de un Colaborador 
        /// </summary>
        /// <param name="IdColaborador"></param>
        public DataTable ObtenerPuestosTareasCapacidadesColaboradorPorDefecto(Colaborador colaborador)
        {
            return persistencia.ObtenerPuestosTareasCapacidadesColaboradorPorDefecto(colaborador);
        }

        /// <summary>
        /// Registra los Puestos con sus Tareas y Capacidades asociadas
        /// </summary>
        public void RegistrarPuestosyCapacidades(Colaborador colaborador)
        {
            persistencia.RegistrarPuestosyCapacidades(colaborador);
        }

        /// <summary>
        /// Actualiza los Puestos de un Colaborador
        /// </summary>
        public void ActualizarPuestosyCapacidades(DataTable dt, Colaborador colaborador)
        {
            persistencia.ActualizarPuestosyCapacidades(dt, colaborador);
        }
    }
}
